package com.example.lotterysystem.common.utils;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Created with IntelliJ IDEA.
 * Description: 短信工具类
 * User: Li_Xiaochi
 * Date: 2025/8/6
 * Time: 1:57
 */
@Component
public class SMSUtil {
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(SMSUtil.class);

    /****************** 配置参数（从application.yml读取）******************/
    @Value("${sms.secret-id}")
    private String secretId;       // 腾讯云API密钥ID

    @Value("${sms.secret-key}")
    private String secretKey;      // 腾讯云API密钥Key

    @Value("${sms.sdk-app-id}")
    private String sdkAppId;       // 短信应用ID（在控制台"应用管理"中查看）

    @Value("${sms.sign-name}")
    private String signName;       // 短信签名内容（需审核通过）

    @Value("${sms.region}")
    private String region = "ap-guangzhou"; // 地域信息（默认广州）

    /**
     * 发送短信方法
     * @param templateId      短信模板ID（需审核通过）
     * @param phoneNumber     接收手机号（国内号码需加86前缀）
     * @param templateParam  模板参数数组（按模板中参数顺序传入）
     *
     * 示例：
     * 模板内容："您的验证码是{1}，请于{2}分钟内填写"
     * 调用示例：sendMessage("123456", "13800138000", new String[]{"1234","5"})
     */
    public void sendMessage(String templateId, String phoneNumber, String templateParam) {
        try {
            // 1. 创建短信客户端
            SmsClient client = createClient();

            // 2. 构建请求对象
            SendSmsRequest req = new SendSmsRequest();
            req.setSmsSdkAppId(sdkAppId);         // 设置应用ID
            req.setSignName(signName);            // 设置签名
            req.setTemplateId(templateId);        // 设置模板ID

            // 3. 处理手机号格式（需包含国际区号）
            String[] phoneNumberSet = new String[]{"+86" + phoneNumber};
            req.setPhoneNumberSet(phoneNumberSet); // 设置接收手机号

            // 4. 设置模板参数（需与模板中的占位符顺序一致）
            req.setTemplateParamSet(new String[]{templateParam});

            // 5. 发送请求并获取响应
            SendSmsResponse resp = client.SendSms(req);

            // 6. 处理响应结果
            if (resp.getSendStatusSet() != null && resp.getSendStatusSet().length > 0) {
                SendStatus status = resp.getSendStatusSet()[0];
                if ("Ok".equals(status.getCode())) {
                    logger.info("短信发送成功 | 手机号:{} | 模板ID:{} | 请求ID:{}",
                            phoneNumber, templateId, resp.getRequestId());
                } else {
                    logger.error("短信发送失败 | 手机号:{} | 模板ID:{} | 错误码:{} | 错误信息:{}",
                            phoneNumber, templateId, status.getCode(), status.getMessage());
                }
            }
        } catch (TencentCloudSDKException e) {
            logger.error("短信发送异常 | 手机号:{} | 模板ID:{} | 异常信息:{}",
                    phoneNumber, templateId, e.getMessage(), e);
        }
    }

    /**
     * 创建腾讯云短信客户端
     * @return SmsClient 短信服务客户端实例
     * @throws TencentCloudSDKException 客户端创建异常
     *
     * 注意：
     * 1. Credential对象需要传入SecretId和SecretKey
     * 2. HttpProfile设置API端点（不同服务端点不同）
     * 3. ClientProfile可以配置HTTP选项和签名方式
     */
    private SmsClient createClient() throws TencentCloudSDKException {
        // 1. 凭证对象（传入SecretId和SecretKey）
        Credential cred = new Credential(secretId, secretKey);

        // 2. HTTP配置（设置API端点）
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("sms.tencentcloudapi.com"); // 短信服务专用端点

        // 3. 客户端配置
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);          // 设置HTTP配置
        // clientProfile.setSignMethod("TC3-HMAC-SHA256"); // 可以设置签名算法（默认TC3）

        // 4. 创建并返回短信客户端
        // 参数说明：凭证对象、地域、客户端配置
        return new SmsClient(cred, region, clientProfile);
    }
}
